//
//  YNIMmanager.h
//  YNIMFramework
//
//  Created by 黄旭 on 2021/7/7.
//

#import <Foundation/Foundation.h>
#import "YNXMPPprotocol.h"
#import "YNIMFrameworkTypedef.h"
@class YNUser;
@class YNOrgTree;
@class YNTwoPeopleChat;
@class YNManyPeopleChat;
@class YNContactGroup;
@class YNRecentChatObejct;
@class YNXMPPManager;
@class PictureModel;
@class RemindSet;

NS_ASSUME_NONNULL_BEGIN

@interface YNIMmanager : NSObject
//是否打印日志
@property(nonatomic,assign)bool printLog;

@property(nonatomic,copy,readonly)NSString *userImId;

@property(nonatomic,copy,readonly)NSString *userName;
//用户类型：1 老师 2 学生
@property(nonatomic,assign,readonly)int userType;
///单例方式使用
+ (YNIMmanager *)sharedInstance;
/// -----初始化IM-----
/// @param server im服务器地址
/// @param code 机构code
/// @param imId 用户id
/// @param userName 用户名字
/// @param dbPath 数据库保存路径
/// @param userType 用户类型：1 老师 2 学生
-(void)initXMPPWithServer:(NSString*)server companyCode:(NSString*)code imId:(NSString*)imId userName:(NSString*)userName loginName:(NSString*)loginName dbPath:(NSString*)dbPath userType:(int)userType;
//获取核心控制类
-(YNXMPPManager*)getXMPPManager;
///添加事件监听者
-(void)addImDelegate:(id<YNXMPPprotocol>)delegate;
//移除事件监听者
-(void)removeImDelegate:(id<YNXMPPprotocol>)delegate;
//设置当前已进入会话页面
-(void)goInChatViewWithUserId:(NSString*)userId;
//设置当前已进入广播页面
-(void)goInBroadcastView;
//设置当前已离开会话页面
-(void)goOutChatView;
//设置当前已离开广播页面
-(void)goOutBroadcastView;
//获取Steam连接状态
- (XMPPConnectType)getXMPPConnectStatus;
///判断是否需要重新登录
- (BOOL)isNeedLoginAgain;
//退出登录
- (void)logout;
///刷新xmpp连接，如果断开则执行重新登录
-(void)refreshXmppConnect;
/**
 * 查找用户或获取某个用户的详细信息
 **/
- (void)searchDetailedInfomationOfAUser:(NSString *)userId;
/// 发送文本消息
/// @param userId <#userId description#>
/// @param text <#text description#>
/// @param aitArray @数据
/// @param groupName <#groupName description#>
- (void)sendTextMessageToUserId:(NSString *)userId text:(NSString*)text aitArray:(NSString *)aitArray isTranspond:(BOOL)isTranspond groupName:(NSString*)groupName;

/// 事先组装好message情况下发送消息
/// @param message <#message description#>
-(void)sendMessage:(YNMessage *)message;

/// 发送普通消息回执
/// @param userId <#userId description#>
/// @param messageType <#messageType description#>
-(void)sendReceiptMessageToUserId:(NSString*)userId type:(ReceiptMessageType)messageType;

/**HX** 发送广播消息 **/
-(void)sendBroadcastMessage:(NSArray<NSString*>*)reciveUserIds body:(NSString*)body;

/// 发送图片
/// @param message <#message description#>
/// @param pic <#pic description#>
/// @param block <#block description#>
- (void)sendPhotoMessage:(YNMessage *)message pic:(PictureModel *)pic uploadBlock:(uploadChatFileBlock)block;

/// 重发消息
/// @param message <#message description#>
- (void)reSendMessage:(YNMessage *)message uploadBlock:(uploadChatFileBlock)block;

///发送文件
- (void)sendFileMessage:(YNMessage *)message uploadBlock:(uploadChatFileBlock)block;

///发送语音
- (void)sendVoiceMessage:(YNMessage *)message uploadBlock:(uploadChatFileBlock)block;

///发送文件消息回执
- (void)sendFileReturnMessage:(YNMessage *)message;
/**
 获取漫游消息记录
 黄旭 2017-12-04
 @param messageType 消息类型
 @param chatId 二人会话对方的id，讨论组/群id，广播传空
 @param msgCount 拉取消息条数 正数为向上拉取，负数为向下拉取
 @param sendTime 消息时间，为空时拉取最新的几条数据，格式为："2017-11-30 17:12:12.20" 精确到毫秒
 @param isMessageNewListDat YES:消息列表拉取的消息漫游，NO：不是消息列表拉取的消息漫游
 */
-(void)getRoamMessageRecordWithChatType:(ReceiptMessageType)messageType chatId:(NSString*)chatId msgCount:(NSInteger)msgCount sendTime:(NSString*)sendTime isMessageNewListDat:(BOOL)isMessageNewListDat;
/**
 漫游删除会话列表的会话消息
 黄旭 2017-12-13
 @param messageType 消息类型
 @param chatId 二人会话对方的id，讨论组/群id，广播消息没有删除操作
 */
-(void)deleteRoamMessageListWithChatType:(ReceiptMessageType)messageType chatId:(NSString*)chatId;
/**
 撤回消息，发送IQ消息
 2018-11-28JC添加
 
 @param messageType 消息类型
 @param chatId 二人会话对方的id，讨论组/项目组群id，广播消息没有删除操作
 @param packetId 消息id
 @param sendTime 时间
 */
-(void)updateWithdrawMessageListWithChatType:(ReceiptMessageType)messageType chatId:(NSString*)chatId packetId:(NSString *)packetId sendTime:(NSString *)sendTime;
/*
 *手动获取组织机构和群讨论组等信息
 */
- (void)manualFetchUserData;
/**
 * 概述: 创建讨论组
 * @pram array 讨论组成员
 */
- (void)creatDiscussionWithUsers:(NSArray *)array;
/**
 * 概述: 创建群
 * @pram array          群成员
 *       groupName      为群号,只能是字母、数字 (我也不晓得这是什么)
 *       naturalName    群名称 (必填)
 *       subject        群公告 (通常为nil)
 *       desc           群描述
 */
- (void)creatGroupWithUsers:(NSArray *)array GroupName:(NSString *)groupName NaturalName:(NSString *)naturalName subject:(NSString *)subject Desc:(NSString *)desc;
/**
 * 概述: 群和讨论组添加成员
 * @pram groupName 群或讨论组ID
 *       array     添加的成员列表
 */
- (void)addUserWithGroupName:(NSString *)groupName Users:(NSArray *)array;
/**
 * 概述: 退出群和讨论组
 * @pram groupName 群或讨论组ID
 */
- (void)leaveGourpWithGroupName:(NSString *)groupName;
/**
 * 概述: 获取群信息及群成员
 * @pram groupName 群ID
 */
- (void)getGroupInfoWithGoupName:(NSString *)groupName;
/**
 * 概述: 获取群共享文件
 * @pram groupName 群ID
 */
- (void)getFileOfGroupShareWithGoupName:(NSString *)groupName;
/**
 * 概述: 获取讨论组信息及讨论组成员
 */
- (void)getDiscussionInfoWithDiscussionName:(NSString *)DiscussionName;
/**
 * 概述: 获取项目组信息及项目组成员
 */
- (void)getProjectTeamInfoWithTeamName:(NSString *)ProjectTeamName;
/**
 * 概述: 获取一批用户的详细信息
 * @pram memberArray 用户ID数组
 */
- (void)getUserListWithUserNoList:(NSArray *)memberArray;
/**
 * 概述: 修改群和讨论组公告
 */
- (void)modifyGroupSubject:(NSString *)subjuct GroupName:(NSString *)groupName;
///更新消息提醒设置
- (BOOL)updateMessageRemindSetting:(RemindSet *)remindSet;


////////////////////////////////类静态方法调用///////////////////////////////////////////////
///查询消息提醒设置信息
+ (RemindSet *)queryMessageRemindSetting;
///通过群/讨论组ID查询消息提醒信息 0 不提醒 1 提醒
+ (NSInteger)queryMessageRemindWithGroupID:(NSString *)groupID;
///更新群/讨论组消息提醒信息方式type  0 不提醒 1 提醒
+ (BOOL)updateMessageRemindWithGroupID:(NSString *)groupId type:(NSInteger)type;
///视频会议间收到聊天消息解析
+(void)meetingReceiveMessage:(YNMessage *)message messageControType:(YNBubbleMessageType)controType;
/**
 *  解析富文本等消息返回一个数组
 *  或者 是 [字符串|图片|表情 ... , 表情个数, 是否图片文本混排]
 */
+ (NSMutableArray*)parserMessageStr:(NSString *)message messageBody:(NSString *)messageBody;
/**
 判断群，讨论组，项目组，两人会话
 
 @param userNo
 @return 0：二人会话 1:群 2：讨论组 3：项目组
 */
+(CurrenChatObjType)getCurrentMessageChatTypemanyPeopleChatWith:(NSString *)userNo;
//删除数据库中所有组织机构，用户，组织机构关系树
+ (BOOL)deleteAllUserAndOrgTree;
//2016-9-9jc添加，逻辑删除数据库中所有组织机构，用户，组织机构关系树
+(BOOL)logicDeleteAllUserAndOrgTree;
/**
 获取组织机构数据库数据的条数，也相当于判断其是否有数据
 
 @return 数据数
 */
+ (NSUInteger)getOrgTreeDataCountInDatabase;

//登陆成功后保存组织机构信息和登录用户信息
+ (BOOL)saveContactOrgWithOrgDictionary:(NSDictionary *)dic;

//保存群/讨论组信息
+ (BOOL)saveContactGroupWithGroupType:(int)groupType orgDictionary:(NSDictionary *)dic;

/**
 @brief 根据parentOrgNo节点查询下面的用户或部门
 
 @param parentOrgNo 组织机构的上级ID，等于0时为根节点
 @param orgType 查询组织机构类型（1：查询所有，2：查询联系人班级，3：查询组织机构下面信息）
 @param allStudent 当上一个参数为contactOrgType时用此参数 yes：查询所有班级数据 NO:查询2-行政班、3-教学班
 @param needAllCount 是否需要计算总人数
 @param needOnlinCount 是否需要计算在线人数
 @param needAllUsers 是否需要返回组织机构下的所有user对象
 @param parentOrgNoS 多个父节点一并查询的父ID字符串
 @param start 分页查询需要的开始行节点
 @param lench 分页查询需要的一次获取数据的条数
 @param countBlock 在分线程里完成总共和在线人数统计的回调
 @return 包含用户或部门的字典
 */
+ (NSDictionary *)queryContactOrgByParentOrgNo:(NSString *)parentOrgNo orgType:(OrgType)orgType getAllStudentDataS:(BOOL)allStudent needCalcuAllCount:(BOOL)needAllCount needCalcuOnlineCount:(BOOL)needOnlinCount needAllUsers:(BOOL)needAllUsers orgNoStringS:(NSString*)parentOrgNoS limitStart:(NSUInteger)start limitLength:(NSUInteger)length completeCount:(void(^)(void))countBlock;

/**
 @brief 根据parentOrgNo节点查询下面的用户或部门
 老师-联系人-学生界面   查询实习活动数据
 
 @param parentOrgNo 组织机构的上级ID，等于0时为根节点
 @param orgType 查询组织机构类型（1：查询所有，2：查询联系人班级，3：查询组织机构下面信息）
 @param needAllCount 是否需要计算总人数
 @param needOnlinCount 是否需要计算在线人数
 @param needAllUsers 是否需要返回组织机构下的所有user对象
 @param countBlock 在分线程里完成总共和在线人数统计的回调
 @return 包含用户或部门的字典
 */
+ (NSDictionary *)queryContactOrgInternshipByParentOrgNo:(NSString *)parentOrgNo orgType:(OrgType)orgType needCalcuAllCount:(BOOL)needAllCount needCalcuOnlineCount:(BOOL)needOnlinCount needAllUsers:(BOOL)needAllUsers completeCount:(void(^)(void))countBlock;

/**
 计算该组织机构里的总人数数量
 
 @param orgType 类型
 @param parentOrgNo 组织id
 @param allStudent 当 orgType为contactOrgType时有效
 @return 数量
 */
+(NSInteger)calculateOrgTotalUserNumberWithorgType:(OrgType)orgType getAllStudent:(BOOL)allStudent OrgNo:(NSString *)parentOrgNo;

/**
 *  @brief 获取所有学生信息用户
 *
 *  @return 所有学生信息用户
 */
+ (NSArray *)queryAllStudentUser;

//根据gruoupName查询用户
+ (NSArray *)queryByGruoupName:(NSString *)groupName isAdmin:(BOOL)isAdmin onlyGetTeachers:(BOOL)onlyTeacher;

/**
 *  @brief 获取所有老师信息用户
 *
 *  @return 所有老师信息用户
 */
+ (NSArray *)queryAllTeacherUser;

/**
 *  @brief  离线时清除所有用户在线状态
 *
 *  @return YES 执行成功 NO 失败
 */
+ (BOOL)clearUserOnlineStatusAtTheTimeOfOffline;

//更新用户状态
+ (BOOL)updateUserStatus:(YNUser *)user updatePcStatus:(BOOL)pcStatus updatePhoneStatus:(BOOL)phoneStatus;

//更新用户头像url
+ (BOOL)updateUserheadUrl:(YNUser *)user;

/**
 *  @brief 更新一条用户头像url
 *
 *  @param user 用户对象
 */
+ (BOOL)updateUserheadUrl:(YNUser *)user inDatabase:(FMDatabase *)db;

/**
 *  保存所有用户在线信息
 *
 *  @param userStatusArray
 */
+ (BOOL)updateAllUserStatus:(NSDictionary *)statusDic;

/**
 *  @brief  搜索联系人
 *
 *  @param  keywords 搜索关键字
 *  @param  onlyTeacher 是否只搜教师相关数据
 *  @param  orgType 搜索的组织机构类型
 *  @return 搜索结果
 */
+ (NSDictionary *)searchContactResultByKeywords:(NSString *)keywords canSearchMe:(BOOL)searchMe  onlyGetTeacherData:(BOOL)onlyTeacher orgType:(OrgType)orgType;

//查询所有群/讨论组
+ (NSArray *)queryContactGroup:(int)groupType onlyGetTeachers:(BOOL)onlyTeacher;

//查询讨论组创建者-返回创建者id
+ (NSArray<NSString*> *)queryCreatorOfDiscussionGroup;

//更新用户信息
+ (BOOL)updateUserInformation:(YNUser *)user;

//更新群或讨论组信息
+ (BOOL)updateContactGroup:(YNContactGroup *)group;


//获取当前用户
+ (YNUser *)queryCurrentUser;

//根据用户imID查询用户
+ (YNUser *)queryUserWithUserNo:(NSString *)userNo;

//根据用户ID查询用户
+ (YNUser *)queryUserWithUserId:(NSString *)userId;

//组织机构ID判断组织机构是否存在
+ (BOOL)whetherTheOrganTreeExists:(NSString *)organNo;

// 判断群组/讨论组是否存在
+(BOOL)isContactGroupExistIn:(NSString *)groupName groupType:(int)groupType;

//查询群管理员
+ (NSArray *)queryContactGroupAdministratorByGroupName:(NSString *)groupName;

//查询用户所在组织机构
+ (YNOrgTree *)queryOrgByUserNo:(NSString *)userNo;

//遍历所有上级组织机构
+ (NSMutableArray *)queryAllParentOrgByParentOrgNo:(NSString *)parentOrgNo;

/**
 *  @brief  根据群/讨论组ID获取群/讨论组信息
 *
 *  @param groupNo   群/讨论组ID
 *  @param groupType
 *
 *  @return
 */
+ (YNContactGroup *)queryGroupByGroupNo:(NSString *)groupNo groupType:(int)groupType;

/**
 *  @brief  增量保存群/讨论组所有信息
 *
 *  @param dictionary
 *  @param groupType
 */
+ (BOOL)saveIncrementalGroupDataWithDictionary:(NSDictionary *)dictionary groupType:(int)groupType;
/**
 *  @brief 创建讨论组
 *
 *  @param group       讨论组信息
 *  @param memberArray 讨论组成员
 */
+ (BOOL)createDiscussionGroup:(YNContactGroup *)group memberArray:(NSArray *)memberArray;

/**
 *  @brief 添加群/讨论组 成员
 *
 *  @param group       讨论组信息
 *  @param memberArray 添加的讨论组成员
 */
+ (BOOL)addGroupMemberWithGroup:(YNContactGroup *)group addMemberArray:(NSArray *)memberArray;

/**
 *  @brief 解散群/讨论组
 *
 *  @param group 群/讨论组信息
 *
 *  @return YES 执行成功 NO 失败
 */
+ (BOOL)dissolveGroupByGroup:(YNContactGroup *)group;

/**
 *  @brief 踢出或离开讨论组
 *
 *  @param user  讨论组成员信息
 *  @param group 讨论组信息
 */
+ (BOOL)leaveGroupWithUser:(YNUser *)user group:(YNContactGroup *)group;


//清除聊天记录
+ (BOOL)deleteChatRecord;


/**
 *  @brief  判断群/讨论组成员是否存在
 *
 *  @param userNo    成员ID
 *  @param groupName 群/讨论组 ID
 *  @param groupType
 *
 *  @return YES ： 存在  NO ： 不存在
 */
+ (BOOL)whetherGroupOfMembers:(NSString *)userNo withGroupNo:(NSString *)groupName groupType:(int)groupType;

/**
 *  @brief 根据群/讨论组Id获取下面的用户
 *
 *  @param groupName 群/讨论组Id
 *  @param groupType 0:群 1:讨论组
 *  @param isAdmin YES 是管理员 NO不是
 *  @param onlyTeacher 只获取老师的数据
 *  @return 一个群/讨论组的成员数组
 */
+ (NSArray *)queryUserByGroupName:(NSString *)groupName isAdmin:(BOOL)isAdmin onlyGetTeachers:(BOOL)onlyTeacher;
/**
 * @brief 保存一条会话 (插入和更新)
 *
 * @param recentChat 会话信息
 */
+ (BOOL)saveRecentChatWithMessage:(YNRecentChatObejct *)recentChat isFromRoamingSource:(BOOL)isRoaming;

/**
 2019-01 修改 查询所有最近会话消息列表数据
 
 @param db <#db description#>
 @param needScreenTop 是否需要赛选处理置顶消息
 @return 集合
 */
+ (NSArray<YNRecentChatObejct*> *)queryAllRecentChatWithNeedScreenTopChat:(BOOL)needScreenTop;

/**
 * @brief 删除会话
 * @param UserNo 要删除会话消息的用户的UserNo, 如果传进来为
 *               nil，清空数据库里所有会话消息
 */
+ (BOOL)deleteRecentChatWithRecentChatObject:(NSString *)UserNo;

/**
 *  功能: 根据ID查询一条最近会话
 *  return:一个最近会话对象
 */
+ (YNRecentChatObejct *)queryRecentChatWithFriendId:(NSString *)friendId;

/**
 根据packId获取本条消息
 
 @param packId
 @return
 */
+ (NSArray *)queryRecentChatWithPackId:(NSString *)packId;

#pragma mark - TwoPeopleChat Method

/**
 * @brief 保存一条消息到历史消息表
 *
 * @param twoPeopleChat 会话消息
 */
+ (BOOL)saveTwoPeopleChatWithMessage:(YNTwoPeopleChat *)twoPeopleChat;

/**
 * @bried 一次保存N条历史消息
 *
 * @param twoPeopleChatArray 消息数组
 */
+ (BOOL)saveMuchTwoPeopleChatWithMessage:(NSArray *)twoPeopleChatArray;


/**
 用于消息漫游判断
 查询最近多少条信息
 
 @param UserNo 聊天对方账号
 @param sendTime 这个时间之前的多少条数据，nil：最近多少条数据
 @param numberCount 查询多少条数据
 @return 返回结果
 */
+(NSArray *)queryTwoPeopleChatTopInfoWithUserNo:(NSString *)UserNo mTime:(NSString *)mTime numberCount:(NSInteger)numberCount;


/**
 用于消息漫游判断
 群、讨论组、项目组、会话查询最近多少条信息
 
 @param groupNo 群、讨论组、项目组id
 @param groupType 类型
 @param sendTime  这个时间之前的多少条数据，nil：最近多少条数据
 @param numberCount 查询多少条数据
 @return 返回结果
 */
+(NSArray *)queryManPeopleChatTopInfoWithGroupNo:(NSString *)groupNo GroupType:(int)groupType mTime:(NSString *)mTime numberCount:(NSInteger)numberCount;

/**
 用于消息漫游判断
 广播通知查询最近多少条信息
 
 @param mTime 时间
 @param numberCount 查询多少条数据
 @return
 */
+(NSArray *)queryBroadcastChatTopInfomTime:(NSString *)mTime numberCount:(NSInteger)numberCount;


/**
 * @brief 清空消息
 *
 * @param UserNo 要清空消息的用户的UserNo, 如果传进来为
 *               nil，清空所有历史消息
 */
+ (BOOL)deleteTwoPeopleChatWithUserNo:(NSString *)UserNo;

/**
 * @brief 查询两人会话历史消息
 *
 * @param UserNo 需要查询的用户的UserNo
 *        start  起始
 *        end    需要返回好多条信息(一般为20)
 */
+ (NSArray *)queryTwoPeopleChatHistoryMessageWithUserNo:(NSString *)UserNo startIndex:(NSInteger)start endIndex:(NSInteger)end;

//只返回发送成功的消息
+ (NSArray *)queryTwoPeopleChatHistoryMessageWithUserNo:(NSString *)UserNo startIndex:(NSInteger)start endIndex:(NSInteger)end isSelectSendSuccessMessage:(BOOL)selectSuccess;

/**
 查询两人会话未读第一条信息
 
 @param userNo 聊天信息id
 @param unReadCount 未读条数
 @return 返回数据
 */
+(NSArray *)queryUnReadFirstTwoPeopleChatMessageWithUserNo:(NSString *)userNo unReadCount:(NSInteger)unReadCount;

/**
 * @brief 根据关键字查询历史消息
 *
 * @param keyWords 用户输入的关键字
 **/
+ (NSArray *)queryTwoPeopleChatByKeywords:(NSString *)keyWords withUserNo:(NSString *)userNo;

#pragma mark - ManyPeopleChat Method

/**
 * @brief 保存一条消息到多人历史消息表
 *
 * @param manyPeopleChat 需要保存的消息对象
 * @param groupType      判断是群消息还是讨论组消息
 **/
+ (BOOL)saverManyPeopleChatWithMesage:(YNManyPeopleChat *)manyPeopleChat groupType:(int)groupType;

/**
 * @brief 清空消息
 *
 * @param GroupNo   需要清空消息的群或讨论组的GroupNo,如果为NIL，清空所有消息
 *        groupType 判断是群消息还是讨论组消息
 **/
+ (BOOL)deleteManyPeopleChatWithGroupNo:(NSString *)GroupNo groupType:(int)groupType;

/**
 * @brief 查询多人会话历史消息
 *
 * @param GroupNo   根据GroupNo查询消息
 *        groupType 判断是群消息还是讨论组消息
 *        start     起始
 *        end       需要返回好多条信息(一般为20)
 **/
+ (NSArray *)queryManyPeopleChatHistoryMessageWithGroupNo:(NSString *)GroupNo groupType:(int)groupType startIndex:(NSInteger)start endIndex:(NSInteger)end;

+ (NSArray *)queryManyPeopleChatHistoryMessageWithGroupNo:(NSString *)GroupNo groupType:(int)groupType startIndex:(NSInteger)start endIndex:(NSInteger)end isSelectSendSuccessMessage:(BOOL)selectSuccess;

/**
 查询多人对话未读消息的第一条消息
 
 @param GroupNo 当前聊天所在的讨论组/项目组或群的ID
 @param groupType 类型
 @param unReadCount 未读消息条数
 @return 返回数据
 */
+ (NSArray *)queryUnReadFirstManyPeopleChatGroupNo:(NSString *)GroupNo groupType:(int)groupType unReadCount:(NSInteger)unReadCount;

/**
 * @brief 根据关键字查询历史消息
 *
 * @param keyWords  用户输入的关键字
 *        groupType 判断是群消息还是讨论组消息
 **/
+ (NSArray *)queryManyPeopleChatByKeywords:(NSString *)keyWords groupNo:(NSString *)groupNo groupType:(int)groupType;

/**
 查询艾特@数据
 2018-11-16 JC添加
 @param groupType
 @param groupNo
 @return 返回结果
 */
+ (NSArray *)queryManyPeopleChatAitWithGroupTyoe:(int)groupType groupNo:(NSString *)groupNo;

/**
 根据groupNo查询该条信息
 2019-1-30 JC添加
 @param groupType
 @param groupNo
 @return 返回结果
 */
+ (NSArray *)queryManyPeopleChatWithGroupTyoe:(int)groupType groupNo:(NSString *)groupNo;

/**
 查询艾特@个人或艾特@所有人，离最新一条数据共有多少条数据
 2018-11-16 JC添加
 
 @param groupType
 @param groupNo
 @param aitContactMark 1：艾特@自己，2：艾特所有人
 @return 返回结果
 */
+ (NSInteger)queryManyPeopleChatAitCountWithGroupTyoe:(int)groupType groupNo:(NSString *)groupNo ynmanyPeopleChat:(YNManyPeopleChat*)ynmanyPeopleChat;

/**
 修改艾特@数据为默认0的数据
 2018-11-16 JC添加
 @param groupType
 @param groupNo
 */
+ (BOOL)updateManyPeopleChatAitWithGroupTyoe:(int)groupType groupNo:(NSString *)groupNo;


#pragma mark - 根据id获取名字
/**
 * @brief 根据id获取名字
 **/
+ (id)queryUserNameByUserID:(NSString *)userID chatType:(int)chatType;

#pragma mark - 保存同步下来的会话列表
/**
 * 将同步下来的会话列表保存到数据库
 * pram: array
 */
+ (BOOL)saveSessionListWithInfo:(NSArray *)infos;

/**
 解析和保存拉取到的漫游消息
 
 @param infos 消息数组
 @param isNewListPullData YES:消息列表拉取最新消息漫游
 @return 结果
 */
+ (BOOL)parsingAndSaveRoamMessageWithInfo:(NSArray *)infos isMessageListData:(BOOL)isMessageListData isNewListPullData:(BOOL)isNewListPullData;

/**
 *  @brief 根据parentOrgNo获取组织机构
 *
 *  @param parentOrgNo 父节点
 *
 *  @return 结果按照ordId降序排列
 */
+ (NSArray *)queryOrgTreeByParentOrgNo:(NSString *)parentOrgNo;

/**
 根据userNo获取本条消息
 
 @param userNo
 @return
 */
+ (NSArray *)queryRecentChatWithUserNo:(NSString *)userNo;

/**
 查询会话人的消息记录里时间最早的时间
 黄旭 2017-12-5
 @param userNo 用户id
 @param db 数据库对象
 @return 时间字符串
 */
+ (NSString*)queryMinTimeByTwoPeopleChatWithUserNo:(NSString*)userNO;

//根据userNo查询本条信息
+ (NSArray*)queryTwoPeopleChatWithUserNo:(NSString*)userNO;

/**HX** 将userNo未读消息的未读数做加一或减一的更新 **/
+ (BOOL)updateUserUnreadCountByOneWithUserNo:(NSString*)UserNo isAddOne:(BOOL)addOne;
/**
 *  @brief  根据组织机构ID查询下面的所有user对象
 *
 *  @param orgNo   组织机构ID
 *
 *  noTeacher 是否不包含老师
 *
 *  @return YNUser数据数组
 */
+ (NSArray<YNUser*>*)queryAllUsersByOrgNos:(NSString *)orgNos isNoTeacher:(BOOL)noTeacher;

/**
 查询自己在群组里的角色（是否是管理员）
 
 @param groupType
 @return 结果集
 */
+ (NSArray<NSDictionary*> *)queryMyGroupRoleWithGroupId:(NSString*)groupId;
/**
 删除最近会话列表里的所有系统和通知消息
 
 @return
 */
+ (BOOL)deleteRecentSystemAndInformChat;

#pragma mark - 更新会话消息
/**
 * 收到回执，更新数据库里面的消息
 * isChange是选择最近会话是否全更新
 */
+ (BOOL)updateChatWithMessage:(YNMessage *)message changRecentChat:(BOOL)isChange;

//更新未读标识
+ (BOOL)updateUnReadMessageNumberWithIdentify:(NSString *)identify;

//将广播消息标记为已读
+ (BOOL)updateIsReadToReadInDatabaseWithPacketid:(NSString *)packetid;

//更新消息的高度
+ (BOOL)updateMessageHeightWithMessage:(YNMessage*)message;

/**JC** 将isNewListPullData更新为YES，表示已经拉取过消息漫游 **/
+ (BOOL)updateRecentNewListPullDataUnreadCountByOneWithUserNo:(NSString *)userNo;

//删除广播消息: if packetId = nil , delete ALL Broadcast.
+ (BOOL)deleteBroadcastMessageWithPacketId:(NSString *)packetId;

//查询20条广播消息
+ (NSArray *)queryBroadcastWithStartIndex:(NSInteger)start
                                 endIndex:(NSInteger)end;

#pragma mark - Broadcast Notification Mothed
//删除广播通知数据
+ (BOOL)deleteBroadcastNotificationWithObject:(id)object;

//查询广播通知数据
+ (NSArray *)queryBroadNotificationWithType:(YNBroadcastNotificationType)broadcastNotificationType;

//查询未读广播通知数据
+ (NSArray *)queryUnReadBroadNotificationWithType:(YNBroadcastNotificationType)broadcastNotificationType;

//删除一部分广播通知数据
+ (BOOL)deleteBroadcastNotificationWithMessageObject:(id)object;

//pocketId为空则更新全部未读通知
+ (BOOL)updateUnReadBroadNotificationWithType:(YNBroadcastNotificationType)broadcastNotificationType pocketId:(NSString *)pocketId;
#pragma end

/**
 *  在登录成功以后, 调用此方法
 *  1.更新两人会话, 将会话中发送中的状态转变成发送失败状态
 *  2.更新多人会话, 将会话中发送中的状态转变成发送失败状态
 *  3.更新最近会话, 将会话中发送中的状态转变成发送失败状态
 */
+ (BOOL)updateMessageSendingStateWhenLoggedIn;

/**
 * 根据传来的消息删除对应的会话消息
 */
+ (BOOL)deleteAChatMessageFromMessageData:(YNMessage *)message;

// 图片下载后更新
+ (BOOL)updateMessageImageWithMessage:(YNMessage*)message;

//更新文件消息状态
+ (BOOL)updateMessageFileStateWithMessage:(YNMessage*)message;

/**
 *  更新语音已读状态 2016.8.1jc添加
 *
 *  @param message message对象
 *
 *  @return 返回参数
 */
+(BOOL)updateMessageVoiceStateWithMessage:(YNMessage *)message;

/**
 修改两人会话撤回状态
 
 @param packId ID
 @return
 */
+(BOOL)updateTwoPeopleChatWithdrawWithPackId:(NSString *)packId;

/**
 JC修改群，讨论组，项目组撤回状态
 
 @param packId id
 @param groupType
 @return
 */
+(BOOL)updateManyPeopleMessageWithdrawWithPacketId:(NSString *)packId groupType:(int)groupType;

/**
 修改撤回状态  2018.11.27jc添加
 
 @param chatId 对方id
 @param packId 消息id
 @return
 */
+(BOOL)updateRecentChatWithdrawWithChatId:(NSString *)chatId packId:(NSString *)packId;

/**HX** 获取会话列表本地存的指定userNo的未读数 **/
+ (int)queryUnReadWithUserNo:(NSString *)userNo;
///保存新的群组的提示设置
+ (BOOL)saveNewGroupRemind:(NSString *)groupId;
///imId兼容转化为平台userId
+(NSString*)getUseridFormImId:(NSString*)imId;

////////////////////////////////SDK内部私有调用方法///////////////////////////////////////////////
//添加广播消息id到集合
-(void)addBroadcastUnreadMsgIds:(NSString*)ids;
//获取当前在与谁的会话页面
-(NSString*)getIdCurrChatWithUser;
//获取当前是否在广播消息页面
-(NSString*)getIdCurrBroadcastView;
//清掉广播消息未读id记录数组里存的该条id
-(void)clearBroadcastMsgId:(NSString*)idString;
///判断未读广播缓存里是否有这个广播
-(BOOL)broadcastUnreadsHaveId:(NSString*)packetId;
//清掉广播消息未读id记录数组里的全部数据
-(void)clearBroadcastUnreadIds;
@end

NS_ASSUME_NONNULL_END
